﻿using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using ContactManagement.App_GlobalResources;
using ContactManagement.AppCode.DynamicDataType.Creation;
using EFDataModel;
using System.Linq;


namespace ContactManagement.Models.DynamicData
{
    /// <summary>
    /// Bearbeiten des Models für DynamicData, es wird für alle Dynamischen Datentypen das gleiche Model verwendet, 
    /// es werden nur im View abhängig vom Datentyp nicht alle Felder angezeigt.
    /// </summary>
    public class EditModel : IEditModel
    {
        /// <summary>
        /// Gibt an ob es sich um einen Pflichtwert handelt
        /// </summary>
        [Display(Name = "IsRequiredRESX", ResourceType = typeof(AdminViews))]
        public bool IsRequired { get; set; }

        /// <summary>
        /// Gibt an wie Lang der string, wert maximal sein darf, bei Integer gibt er an wie groß der Wert maximal sein darf
        /// </summary>
        [Display(Name = "MaxLengthRESX", ResourceType = typeof(AdminViews))]
        public int? MaxLength { get; set; }

        /// <summary>
        /// die Mindestlänge bei Strings, bei Integer Werten die unterste Grenze für den Wert
        /// </summary>
        [Display(Name = "MinLengthRESX", ResourceType = typeof(AdminViews))]
        public int? MinLength { get; set; }

        /// <summary>
        /// Der Formatstring der für die Displayvalues verwendet wird. hier steht {0} für den Wert der gesetzt werden soll, hier kann ein ganz normaler .NET FormatString angegeben werden
        /// </summary>
        [Display(Name = "FormatStringRESX", ResourceType = typeof(AdminViews))]
        public string FormatString { get; set; }

        /// <summary>
        /// Ein RegExString der dem Datentyp für Validierungszecke hinterlegt werden kann
        /// </summary>
        [Display(Name = "RegExStringRESX", ResourceType = typeof(AdminViews))]
        [StringLength(10000, MinimumLength = 1)]
        public string RegExString { get; set; }

        /// <summary>
        /// Der Name des Eingabefeldes
        /// </summary>
        [Display(Name = "DynamicDataNameRESX", ResourceType = typeof(AdminViews))]
        [StringLength(50, MinimumLength = 1)]
        [Required]
        public string Name { get; set; }

        /// <summary>
        /// Die Beschreibung des Eingabefeldes, für welchen Zweck dieses verwendet werden soll
        /// </summary>
        [Display(Name = "DescriptionRESX", ResourceType = typeof(AdminViews))]
        [StringLength(10000, MinimumLength = 1)]
        public string Description { get; set; }

        /// <summary>
        /// Gibt an ob das Eingabefeld angezeigt werden soll
        /// </summary>
        [Display(Name = "IsVisibleRESX", ResourceType = typeof(AdminViews))]
        public bool IsVisible { get; set; }

        /// <summary>
        /// Die SortId nach der die Engabefelder auf der Seite dargestellt werden
        /// </summary>
        [Display(Name = "SortIDRESX", ResourceType = typeof(AdminViews))]
        [StringLength(10)]
        public string SortId { get; set; }

        /// <summary>
        /// Benutzerdefinierte CSS Klasse die zusätzlich am Eingabefeld gesetzt wird und am Error Displayfield.
        /// </summary>
        [Display(Name = "CustomCssClassRESX", ResourceType = typeof(AdminViews))]
        public string CustomCssClass { get; set; }

        /// <summary>
        /// Gibt an ob nach dem dynamischen Datentypen gefiltert werden kann.
        /// </summary>
        [Display(Name = "IsFilterableRESX", ResourceType = typeof(AdminViews))]
        public bool IsFilterable { get; set; }

        /// <summary>
        /// Die ausgewählte Dynamische DynamicDataTypeCategoryId, gehört zur Liste mit DynamicDataTypeCategories
        /// </summary>
        [Required]
        public long DynamicDataTypeCategoryId { get; set; }

        /// <summary>
        /// Die Auflistung der zur Verfügung stehenden Dynamischen Kategorien. Jeder Eintrag muss einer Kategorie zugeordnet werden, diese wird dann
        /// beim Anzeigen der einzelnen Werte für die ausgewählte Kategorie über den Werten angezeigt.
        /// </summary>
        [Display(Name = "DynamicDataTypesCategoryRESX", ResourceType = typeof(AdminViews))]
        public IEnumerable<SelectListItem> DynamicDataTypeCategories
        {
            get
            {
                List<SelectListItem> items = new List<SelectListItem>();
                //Alle im System hinterlegten Dynamischen DataType Kategorien anzeigen
                var categories = from eDynamicDataCategories in CurrentHttpContext.GetDataModel().EFCategoryMenge.OfType<DynamicDataTypeCategory>() select eDynamicDataCategories;
                foreach (DynamicDataTypeCategory eValue in categories)
                {
                    items.Add(new SelectListItem { Value = eValue.ID.ToString(), Text = eValue.Name });
                }

                return new SelectList(items, "Value", "Text");
            }
        }

        /// <summary>
        /// Der aktuelle Dynamische Datentyp, dienst nur Zur Anzeige von Daten!
        /// </summary>
        public EFDynamicDataType CurrentDynamicDataType { get; set; }


    }
}